      !<@file 
      !>@brief Rotina de clusterização baseada apenas no valor da velocidade de cada nó.
      !>
      !> O número de classes é definido previamente.
      subroutine clusteriza(c,nx,nz,Nclasses)
      implicit none

      double precision:: c(nx,nz)!< [in,out] grid de valores para a clusterização, no caso velocidade nos nós do problema inverso
      integer :: nx !< [in] dimensão do grid direção x
      integer :: nz!< [in] dimensão do grid direção z
      integer :: i,j
      integer :: ierr !< Indica se houve erro na alocação de memória

      integer :: Nclasses !< [in] número de classes para a clusterização
      integer :: kncl !< Contador do número de classes.
      integer :: clmenord !< A classe que tem a menor distância em relação ao valor analisado
      double precision :: dmenor !< menor distância
      double precision:: difclasse !< quadrado da norma do vetor diferença entre os vetores de classes atual e antigo
      double precision, dimension(:), allocatable:: Classes !< vetor de classes atual
      double precision, dimension(:), allocatable:: Classesold!< vetor de classes antigo
      integer, dimension(:), allocatable:: freqclasses!< número de casos classificados em cada classe


      

      allocate(Classes(Nclasses),stat=ierr)
      allocate(Classesold(Nclasses),stat=ierr)
      allocate(freqClasses(Nclasses),stat=ierr)
	
      do kncl=1,Nclasses !<inicialização dos valores das classes, poderia ser feito aleatoriamente.
	  Classesold(kncl) = c(nx/2,nz/Nclasses*(kncl-1)+1)
	  Classes(kncl) =0.0
	  freqClasses(kncl) =0
      enddo

      difclasse=1000.d0

      do !inicio da clusterização

	  do j=1,nz
	      do i=1,nx
		  dmenor = sqrt((c(i,j)-Classesold(1))**2)
		  clmenord = 1
		  do kncl = 2,Nclasses
		      if(sqrt((c(i,j)-Classesold(kncl))**2).lt.dmenor)then
			dmenor = sqrt((c(i,j)-Classesold(kncl))**2)
			clmenord = kncl
		      endif
		  enddo !<fim do loop nas classes.
		  Classes(clmenord) = Classes(clmenord) + c(i,j)
		  freqClasses(clmenord) = freqClasses(clmenord) +1
	      enddo
	  enddo !<fim do loop nos nós.

	  do kncl = 1,Nclasses
	      Classes(kncl) = Classes(kncl)/ dfloat(freqClasses(kncl))
	  enddo

	  difclasse = 0.0d0
	  do kncl = 1,Nclasses
	      difClasse = difclasse+ sqrt((Classes(kncl) - Classesold(kncl))**2)
	  enddo 
	  if(difclasse.lt. 10.0d0) exit  !< condição para parar as iterações da clusterização   

	  do kncl = 1,Nclasses
	      Classesold(kncl) = Classes(kncl)
	      Classes(kncl) =0.0
	      freqClasses(kncl) =0
	  enddo
      enddo!< fim da clusterização


      do j=1,nz !< atribui o valor das classes aos nós da matriz.
	  do i=1,nx
	      dmenor = sqrt((c(i,j)-Classes(1))**2)
	      clmenord = 1
	      do kncl = 2,Nclasses
		  if(sqrt((c(i,j)-Classes(kncl))**2).lt.dmenor)then
		    dmenor = sqrt((c(i,j)-Classes(kncl))**2)
		    clmenord = kncl
		  endif
	      enddo
! 	      c(i,j) =  Classes(clmenord)
	      c(i,j) =  (c(i,j)+Classes(clmenord))/2.0d0 
	  enddo
      enddo

      deallocate(Classes)
      deallocate(Classesold)      
      deallocate(freqclasses) 

      return

      end subroutine clusteriza

